#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)

#include <stdio.h>

//int main()
//{
//	int a[3][4] = { 0 };
//
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof(a[0][0]));
//	printf("%d\n", sizeof(a[0]));	//a[0]可以理解为第一行的数组名
//	printf("%d\n", sizeof(a[0] + 1));	//a[0]并不是首先与sizeof或者&进行运算，a[0]+1,是第一行第二个元素的地址
//	printf("%d\n", sizeof(a + 1));	//a表示二维数组首元素的地址，第一行的地址，+1是第二行的地址
//	printf("%d\n", sizeof(*(a + 1)));	//相当于a[1]
//	printf("%d\n", sizeof(a[3]));	// 值属性，类型属性。sizeof中的表达式不真实运算
//
//	return 0;
//}

//int main()
//{
//	short s = 5;
//	int a = 4;
//	printf("%d\n", sizeof(s = a + 6));	//2
//	printf("%d\n", s);//5
//
//	return 0;
//}

//int main()
//{
//	int a[4] = { 1,2,3,4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%x %x", ptr1[-1], *ptr2);	//32位平台
//
//	return 0;
//}

//int main()
//{
//	char* c[] = { "ENTER","NEW","POINT","FIRST" };
//	char** cp[] = { c + 3, c + 2, c + 1, c };
//	char*** cpp = cp;
//
//	printf("%s\n", **++cpp);	//POINT
//	printf("%s\n", *-- * ++cpp + 3);	//ER
//	printf("%s\n", *cpp[-2] + 3);	//ST
//	printf("%s\n", cpp[-1][-1] + 1);	//EW
//
//	return 0;
//}

//杨氏矩阵
//1 2 3
//2 3 4
//4 5 6
//寻找其中的一个元素，时间复杂度小于O(n)
//int find_num(int arr[3][3], int* row, int* col, int key)
//{
//	int x = 0;
//	int y = *col - 1;
//
//	while (x < *row && y >= 0)
//	{
//		if (arr[x][y] < key)
//		{
//			x++;
//		}
//		else if(arr[x][y] > key)
//		{
//			y--;
//		}
//		else
//		{
//			*row = x;
//			*col = y;
//			return 1;
//		}
//	}
//	return 0;
//}
//
//int main()
//{
//	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
//	int k = 7;
//	int x = 3;
//	int y = 3;
//	//找到返回1，找不到返回0
//	int ret = find_num(arr, &x, &y, k);
//	if (ret)
//	{
//		printf("找到了\n");
//		printf("a[%d][%d] =%d\n", x, y, k);
//	}
//	else
//	{
//		printf("找不到\n");
//	}
//
//	return 0;
//}

//实现一个函数，可以左旋字符串中的k个字符
#include <string.h>
//void string_left_rotate(char* str, int k)
//{
//	for (int i = 0; i < k; i++)
//	{
//		//每次左旋转1个字符
//		char tmp = *str;
//		int len = strlen(str);
//		for (int j = 0; j < len; j++)
//		{
//			*(str + j) = *(str + j + 1);
//		}
//		*(str + len - 1) = tmp;
//	}
//}
//#include <assert.h>
//void reverse(char* left, char* right)
//{
//	assert(left);
//	assert(right);
//
//	while (left < right)
//	{
//		char tmp = *left;
//		*left = *right;
//		*right = tmp;
//		left++;
//		right--;
//	}
//}
////三步反转法
//void string_left_rotate(char* str, int k)
//{
//	assert(str);
//	int len = strlen(str);
//	reverse(str, str + k - 1);	//左逆序
//	reverse(str + k, str + len - 1);	//右逆序
//	reverse(str, str + len - 1);	//整体逆序
//}
//
//int main()
//{
//	char arr[10] = "ABCDEF";
//	int k = 2;
//	string_left_rotate(arr, k);
//	printf("%s\n", arr);
//
//	return 0;
//}

//int is_string_rotate(char* str1, char* str2)
//{
//	//长度不相等，肯定不是
//	if (strlen(str1) != strlen(str2))
//	{
//		return 0;
//	}
//	//1.str1字符串的后边追加一个str1
//	int len = strlen(str1);
//	strncat(str1, str1, len);
//	//2.判断str2是否包含在str1中
//	char* ret = strstr(str1, str2);
//	
//	return ret != NULL;
//}
//
//int main()
//{
//	char arr1[20] = "AABCD";
//	char arr2[] = "BCDAA";
//
//	int ret = is_string_rotate(arr1, arr2);
//	if (ret)
//	{
//		printf("yes\n");
//	}
//	else
//	{
//		printf("no\n");
//	}
//
//	return 0;
//}